package main

import (
	"fmt"
	"github.com/gin-gonic/gin"
	"net/http"
	"time"
)

// StatCost 是一个统计耗时请求耗时的中间件
func StatCost() gin.HandlerFunc {
	return func(c *gin.Context) {
		start := time.Now()
		c.Set("name", "小王子") // 可以通过c.Set在请求上下文中设置值，后续的处理函数能够取到该值
		fmt.Println("我是之前的执行方法的！")
		// 调用该请求的剩余处理程序
		c.Next()
		fmt.Println("我是剩余的执行方法哟！")
		// 不调用该请求的剩余处理程序
		// c.Abort()
		// 计算耗时
		cost := time.Since(start)
		//log.Println(cost)
		fmt.Println("我是中间件的结束", cost)
	}
}

// StatCost 是一个统计耗时请求耗时的中间件
func is_cookie() gin.HandlerFunc {
	return func(c *gin.Context) {
		name, err := c.Request.Cookie("access_token")
		if err != nil {
			fmt.Println("获取cookie错误！,err:", err)
		}
		if name == nil {
			//没有登陆授权
			fmt.Println("没有登陆授权");
		} else {
			fmt.Println("获取的cookie：", name)
			c.Next()
			return
		}
		c.JSON(http.StatusOK, gin.H{"error": "err"})
		c.Abort()
	}
}

func main() {
	// 新建一个没有任何默认中间件的路由
	r := gin.New()
	//// 注册一个全局中间件
	//r.Use(StatCost())
	shopGroup := r.Group("/shop", StatCost())
	{
		shopGroup.GET("/index", StatCost(), func(c *gin.Context) {
			name := c.MustGet("name").(string) // 从上下文取值
			//log.Println(name)
			fmt.Println("我想要被夹在中间的方法！:", name)
			c.JSON(http.StatusOK, gin.H{
				"message": "Hello world!",
			})
		})
	}
	r.GET("/login", func(c *gin.Context) {
		c1 := http.Cookie{Name: "access_token", Value: "123", MaxAge: 60}
		http.SetCookie(c.Writer, &c1)
		c.Request.AddCookie(&c1)
		fmt.Println("添加cookie成功！")
	})
	r.GET("/home", is_cookie(), func(c *gin.Context) {
		c.JSON(http.StatusOK, gin.H{"data": "home"})
	})

	r.Run(":9090")
}
